/**
  ******************************************************************************
  * @file    main.c
  * @author  AE Team
  * @version 1.0.3
  * @date    2024-05-28
  * @brief   演示ADC序列持续转换模式，采用软件启动方式，持续读取转换结果,
  *          转换完成的结果通过板载UART发出，115200-8-N-1
  *          请调节电 位 器 RP1 改变ADC_IN6(PA06)端口的电压(0 ~ AVCC)
  *          请使用串口调试助手接收显示串口发送的数据
  *
  * @note    硬件平台：SYM32L010_StartKit_V1.0
  *          接线说明：断开J12
  *                    短接J23,J24,J13
  *
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2024 SIYIMicro.
  * All rights reserved.</center></h2>
  *
  *
  ******************************************************************************
  */


/******************************************************************************/
/* Include files                                                              */
/******************************************************************************/
#include "main.h"
#include "sym32l010_hal_sysctrl.h"
#include "sym32l010_hal_systick.h"
#include "sym32l010_hal_gpio.h"
#include "sym32l010_hal_adc.h"
#include "sym32l010_startkit_board.h"


/******************************************************************************/
/* Local pre-processor symbols/macros ('#define')                             */
/******************************************************************************/

/******************************************************************************/
/* Global variable definitions (declared in header file with 'extern')        */
/******************************************************************************/

/******************************************************************************/
/* Local type definitions ('typedef')                                         */
/******************************************************************************/

/******************************************************************************/
/* Local function prototypes ('static')                                       */
/******************************************************************************/
static void ADC_Init(void);

/******************************************************************************/
/* Local variable definitions ('static')                                      */
/******************************************************************************/

/******************************************************************************/
/* Local pre-processor symbols/macros ('#define')                             */
/******************************************************************************/

/******************************************************************************/
/* Function implementation - global ('extern') and local ('static')           */
/******************************************************************************/


/*******************************************************************************
 ** \brief  Main function of project
 **
 ** \return uint32_t return value, if needed
 **
 **
 ******************************************************************************/
int32_t main(void)
{
    // 配置系统时钟
    HAL_SysCtrl_HSI_SetDiv(HSIOSC_TO_HSI24MHZ);

    // 初始化SysTick
    HAL_InitTick(24000000);

    // 初始化UART  115200-8-N-1 TXD=PA09
    Bsp_Uart_Init(24000000, 115200);

    // 初始化 板载电位器的端口
    Bsp_RheostatPort_Init();

    // 初始化ADC
    ADC_Init();

    HAL_ADC_Start();

    //------------------------------------------------------------
    // 请调节电 位 器 RP1 改变ADC_IN6(PA06)端口的电压(0 ~ AVCC)
    // 通过板载UART查看ADC转换完成的结果及AdcIn6、BGR1V2 输入的电压值
    while (1)
    {
        HAL_Delay(500);

        // 持续转换模式，可随时读取最新转换完成结果
        uint16_t SqrCh0Code = HAL_ADC_Result0_Read();
        uint16_t SqrCh1Code = HAL_ADC_Result1_Read();

        float AdcIn6 = 3.3 * SqrCh0Code / 4095;
        float Bgr1v2 = 3.3 * SqrCh1Code / 4095;
        printf("AdcIn6 = 0x%X  %4.3fV  |  Bgr1V2 = 0x%X  %4.3fV\r\n", SqrCh0Code, AdcIn6, SqrCh1Code, Bgr1v2);
    }
}


/*******************************************************************************
 * @brief  ADC 初始化函数
 * @param  None
 * @retval None
 *
 */
static void ADC_Init(void)
{
    ADC_InitTypeDef             ADC_InitStruct;
    ADC_SqrInitTypeDef          ADC_SqrInitStruct;

    MemClr(&ADC_InitStruct, sizeof(ADC_InitStruct));
    MemClr(&ADC_SqrInitStruct, sizeof(ADC_SqrInitStruct));

    // 使能外设时钟
    HAL_SYSCTRL_ADC_CLK_ENABLE();

    // 配置ADC，序列单次转换模式
    ADC_InitStruct.WorkMode     = ADC_WORKMODE_CONTINUE;              // 多通道持续转换
    ADC_InitStruct.ClockSource  = ADC_CLKSRC_DIV8;                    // ADCCLK = PCLK/8 = 3MHz
    ADC_InitStruct.BgrEn        = ADC_BGR_ENABLE;
    ADC_InitStruct.TempSensorEn = ADC_TS_DISABLE;
    HAL_ADC_Init(&ADC_InitStruct);

    HAL_ADC_Enable();                                                 // 使能ADC

    // 配置序列转换数量、序列通道的模拟输入源、序列通道的采样时间
    ADC_SqrInitStruct.SqrEns     = ADC_ENS_SQRCH0_1;                  // 转换序列0~1
    ADC_SqrInitStruct.SqrCh0In   = ADC_IN6;                           // 配置序列通道0的模拟输入源为ADC_IN6
    ADC_SqrInitStruct.SqrCh0Sam  = ADC_SAMPLE_CLK9;                   // 配置序列通道0的采样时间
    ADC_SqrInitStruct.SqrCh1In   = ADC_IN_BGR1V2;                     // 配置序列通道1的模拟输入源为BGR1V2
    ADC_SqrInitStruct.SqrCh1Sam  = ADC_SAMPLE_CLK262;                 // 配置序列通道1的采样时间
    HAL_ADC_AllSqrChannel_Config(&ADC_SqrInitStruct);
}


/*******************************************************************************
 ** EOF (not truncated)
 ******************************************************************************/
#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
    /* USER CODE BEGIN */
    /* User can add his own implementation to report the file name and line number,
       tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
    /* USER CODE END */
}
#endif /* USE_FULL_ASSERT */


/************************ (C) COPYRIGHT SIYIMicro *****END OF FILE*************/
